package com.ch.engine.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;


/**
 * Before: 前置通知, 在方法执行之前执行
 * After: 后置通知, 在方法执行之后执行 。
 * AfterRunning: 返回通知, 在方法返回结果之后执行
 * AfterThrowing: 异常通知, 在方法抛出异常之后
 * Around: 环绕通知, 围绕着方法执行
 *
 * @author wangchunhui
 * @date 2024/12/20 16:50
 */
@Aspect
@Component
public class TestLogProxy {

    //    @Before("execution(* com.ch.engine.aop.TestAop.*(int,int))")
//    public void before(JoinPoint point){
//        String methodName = point.getSignature().getName();
//        List<Object> ags = Arrays.asList(point.getArgs());
//        System.out.println("调用 前 连接点方法名:" + methodName + "，参数为: " +ags);
//    }
//
//    @After("execution(* com.ch.engine.aop.TestAop.*(int,int))")
//    public void after(JoinPoint point){
//        String methodName = point.getSignature().getName();
//        List<Object> ags = Arrays.asList(point.getArgs());
//        System.out.println("调用 后 连接点方法名:" + methodName + "，参数为: " +ags);
//    }
//
//    @AfterReturning(value = "execution(* com.ch.engine.aop.TestAop.*(int,int))", returning = "result")
//    public void afterReturning(JoinPoint point, Object result) {
//        String methodName = point.getSignature().getName();
//        List<Object> ags = Arrays.asList(point.getArgs());
//        System.out.println("调用 后 连接点方法名:" + methodName + "参数为: " + ags + " 目标执行结果为: " + result);
//    }
//
//
//    @AfterThrowing(value = "execution(* com.ch.engine.aop.TestAop.*(int,int))",throwing = "ex")
//    public void afterThrowing(JoinPoint point, Exception ex){
//        String methodName = point.getSignature().getName();
//        List<Object> ags = Arrays.asList(point.getArgs());
//        System.out.println("调用 后 连接点方法名:" + methodName + "参数为: " +ags+ " 异常为: " + ex);
//    }
    @Around("execution(* com.ch.engine.aop.TestAop.*(int,int))")
    public Object aroundMethod(ProceedingJoinPoint pdj) {
        /*result为连接点的放回结果*/
        Object result = null;
        String methodName = pdj.getSignature().getName();
        /*前置通知方法*/
        System.out.println("前置通知方法>目标方法名：" + methodName + ",参数为：" + Arrays.asList(pdj.getArgs()));
        /*执行目标方法*/
        try {
            result = pdj.proceed();
            /*返回通知方法*/
            System.out.println("返回通知方法>目标方法名" + methodName + ",返回结果为：" + result);
        } catch (Throwable e) {
            /*异常通知方法*/
            System.out.println("异常通知方法>目标方法名" + methodName + ",异常为：" + e);
        }
        /*后置通知*/
        System.out.println("后置通知方法>目标方法名" + methodName);
        return result;
    }
}